/**
 * 判断此对象是否是Object类型
 * @param {Object} obj  
 */
function  isObject(obj){
    return Object.prototype.toString.call(obj)==='[object Object]';
};
/**
 * 判断此类型是否是Array类型
 * @param {Array} arr 
 */
function isArray(arr){
    return Object.prototype.toString.call(arr)==='[object Array]';
};

/**
 * 判断此类型是否是String类型
 * @param {String} obj 
 */
function  isString(obj){
    return Object.prototype.toString.call(obj)==='[object String]';
};

/**
 * 比较两个对象属性名是否相同
 * @param {Object} oldData 
 * @param {Object} newData 
 */
function equalsObj(oldData, newData){
    // 类型为基本类型时,如果相同,则返回true
    if(oldData === newData) return true;
    // 类型为对象并且元素个数相同
    if(isObject(oldData) && isObject(newData) && Object.keys(oldData).length === Object.keys(newData).length){
        // 遍历所有对象中所有属性,判断属性名是否相同
        for (const key in oldData) {
            // 如果另一个对象是否具有该属性，返回true
            if (newData.hasOwnProperty(key)) 
            return true;
        }
    }else if(isArray(oldData) && isArray(newData) && oldData.length === newData.length){
        //类型为数组并且数组长度相同
        for (let i = 0; i < oldData.length; i++) {
        if(!equalsObj(oldData[i],newData[i]))
        //如果数组元素中具有不相同元素,返回false
        return false;
        }
    }else{
        //其它类型,均返回false
        return false;
    }
    //走到这里,说明数组或者对象中所有元素都相同,返回true
    return true;
};